home *** CD-ROM | disk | FTP | other *** search
Text File | 1988-04-19 | 8.9 KB | 547 lines | [TEXT/MACH] |
- \ Graf3d / Mach2 glue code
- \ An example for calling MPW routines from Forth
- \ J. Langowski April 1988
- \ ______________________________________________
-
- Only Forth Also Mac Also Assembler
-
- \ some general definitions first
- 16 CONSTANT portRect
- $9EE constant grayRgn
-
- GLOBAL
- CODE SCALE
- MOVE.L (A6)+,D0
- BMI.S @1
- MOVE.L (A6),D1
- ASL.L D0,D1
- MOVE.L D1,(A6)
- RTS
- @1 MOVE.L (A6),D1
- NEG.L D0
- ASR.L D0,D1
- MOVE.L D1,(A6)
- RTS
- END-CODE
-
- global
- CODE white
- MOVE.L (A5),-(A6)
- SUBQ.L #8,(A6)
- RTS
- END-CODE MACH
-
- global
- CODE black
- MOVE.L (A5),-(A6)
- SUBI.L #16,(A6)
- RTS
- END-CODE MACH
-
- global
- CODE gray
- MOVE.L (A5),-(A6)
- SUBI.L #24,(A6)
- RTS
- END-CODE MACH
-
- : 4ASCII
- 0
- 4 0 DO
- 8 SCALE 0 WORD 1+ C@ +
- LOOP
- ;
-
- 4ASCII gr3D CONSTANT "gr3D \ resource ID
-
- \ Graf3D jump table
-
- CREATE gInitGrf3D
- CREATE gOpen3DPort
- CREATE gSetPort3D
- CREATE gGetPort3D
- CREATE gMoveTo2D
- CREATE gMoveTo3D
- CREATE gLineTo2D
- CREATE gLineTo3D
- CREATE gMove2D
- CREATE gMove3D
- CREATE gLine2D
- CREATE gLine3D
- CREATE gViewPort
- CREATE gLookAt
- CREATE gViewAngle
- CREATE gIdentity
- CREATE gScale
- CREATE gTranslate
- CREATE gPitch
- CREATE gYaw
- CREATE gRoll
- CREATE gSkew
- CREATE gTransform
- CREATE gClip3D
- CREATE gSetPt3D
- CREATE gSetPt2D
-
- \ The glue code is 2636 bytes long, so we allocate
- \ sufficient additional buffer space to put it into
- 2600 ALLOT
-
- : Init3D \ gets Graf3D code from gr3D=1 resource
- \ and copies it into buffer
- "gr3D 1 call GetResource
- dup @ swap call SizeRsrc
- ['] gInitGrf3D swap cmove
- ;
-
- CODE InitGrf3d ( globalPtr -- )
- EXG D4,A7
- MOVE.L (A6)+,-(A7)
- JSR gInitGrf3d
- EXG D4,A7
- RTS
- END-CODE
-
- CODE Open3DPort ( port -- )
- EXG D4,A7
- MOVE.L (A6)+,-(A7)
- JSR gOpen3DPort
- EXG D4,A7
- RTS
- END-CODE
-
- CODE SetPort3d ( port -- )
- EXG D4,A7
- MOVE.L (A6)+,-(A7)
- JSR gSetPort3d
- EXG D4,A7
- RTS
- END-CODE
-
- CODE GetPort3d ( VAR port -- )
- EXG D4,A7
- MOVE.L (A6)+,-(A7)
- JSR gGetPort3d
- EXG D4,A7
- RTS
- END-CODE
-
- CODE MoveTo2d ( x y -- )
- EXG D4,A7
- MOVE.L 4(A6),-(A7)
- MOVE.L (A6),-(A7)
- ADDA.W #8,A6
- JSR gMoveTo2d
- EXG D4,A7
- RTS
- END-CODE
-
- CODE MoveTo3d ( x y z -- )
- EXG D4,A7
- MOVE.L 8(A6),-(A7)
- MOVE.L 4(A6),-(A7)
- MOVE.L (A6),-(A7)
- ADDA.W #12,A6
- JSR gMoveTo3d
- EXG D4,A7
- RTS
- END-CODE
-
- CODE LineTo2d ( x y -- )
- EXG D4,A7
- MOVE.L 4(A6),-(A7)
- MOVE.L (A6),-(A7)
- ADDA.W #8,A6
- JSR gLineTo2d
- EXG D4,A7
- RTS
- END-CODE
-
- CODE LineTo3d ( x y z -- )
- EXG D4,A7
- MOVE.L 8(A6),-(A7)
- MOVE.L 4(A6),-(A7)
- MOVE.L (A6),-(A7)
- ADDA.W #12,A6
- JSR gLineTo3d
- EXG D4,A7
- RTS
- END-CODE
-
- CODE Move2d ( dx dy -- )
- EXG D4,A7
- MOVE.L 4(A6),-(A7)
- MOVE.L (A6),-(A7)
- ADDA.W #8,A6
- JSR gMove2d
- EXG D4,A7
- RTS
- END-CODE
-
- CODE Move3d ( dx dy dz -- )
- EXG D4,A7
- MOVE.L 8(A6),-(A7)
- MOVE.L 4(A6),-(A7)
- MOVE.L (A6),-(A7)
- ADDA.W #12,A6
- JSR gMove3d
- EXG D4,A7
- RTS
- END-CODE
-
- CODE Line2d ( x y -- )
- EXG D4,A7
- MOVE.L 4(A6),-(A7)
- MOVE.L (A6),-(A7)
- ADDA.W #8,A6
- JSR gLine2d
- EXG D4,A7
- RTS
- END-CODE
-
- CODE Line3d ( x y z -- )
- EXG D4,A7
- MOVE.L 8(A6),-(A7)
- MOVE.L 4(A6),-(A7)
- MOVE.L (A6),-(A7)
- ADDA.W #12,A6
- JSR gLine3d
- EXG D4,A7
- RTS
- END-CODE
-
- CODE ViewPort ( r -- )
- EXG D4,A7
- MOVE.L (A6)+,-(A7)
- JSR gViewPort
- EXG D4,A7
- RTS
- END-CODE
-
- CODE LookAt ( left top right bottom -- )
- EXG D4,A7
- MOVE.L 12(A6),-(A7)
- MOVE.L 8(A6),-(A7)
- MOVE.L 4(A6),-(A7)
- MOVE.L (A6),-(A7)
- ADDA.W #16,A6
- JSR gLookAt
- EXG D4,A7
- RTS
- END-CODE
-
- CODE ViewAngle ( angle -- )
- EXG D4,A7
- MOVE.L (A6)+,-(A7)
- JSR gViewAngle
- EXG D4,A7
- RTS
- END-CODE
-
- CODE Identity
- EXG D4,A7
- JSR gIdentity
- EXG D4,A7
- RTS
- END-CODE
-
- CODE Scal ( xfactor yfactor zfactor -- )
- EXG D4,A7
- MOVE.L 8(A6),-(A7)
- MOVE.L 4(A6),-(A7)
- MOVE.L (A6),-(A7)
- ADDA.W #12,A6
- JSR gScale
- EXG D4,A7
- RTS
- END-CODE
-
- CODE Translate ( dx dy dz -- )
- EXG D4,A7
- MOVE.L 8(A6),-(A7)
- MOVE.L 4(A6),-(A7)
- MOVE.L (A6),-(A7)
- ADDA.W #12,A6
- JSR gTranslate
- EXG D4,A7
- RTS
- END-CODE
-
- CODE Pitch ( xangle -- )
- EXG D4,A7
- MOVE.L (A6)+,-(A7)
- JSR gPitch
- EXG D4,A7
- RTS
- END-CODE
-
- CODE Yaw ( yangle -- )
- EXG D4,A7
- MOVE.L (A6)+,-(A7)
- JSR gYaw
- EXG D4,A7
- RTS
- END-CODE
-
- CODE Rol ( zangle -- )
- EXG D4,A7
- MOVE.L (A6)+,-(A7)
- JSR gRoll
- EXG D4,A7
- RTS
- END-CODE
-
- CODE Skew ( zangle -- )
- EXG D4,A7
- MOVE.L (A6)+,-(A7)
- JSR gSkew
- EXG D4,A7
- RTS
- END-CODE
-
- CODE Transform ( src dst -- )
- EXG D4,A7
- MOVE.L 4(A6),-(A7)
- MOVE.L (A6),-(A7)
- ADDA.W #8,A6
- JSR gTransform
- EXG D4,A7
- RTS
- END-CODE
-
- CODE Clip3D ( src1 src2 dst1 dst2 -- flag )
- EXG D4,A7
- CLR.W -(A7)
- MOVE.L 12(A6),-(A7)
- MOVE.L 8(A6),-(A7)
- MOVE.L 4(A6),-(A7)
- MOVE.L (A6),-(A7)
- ADDA.W #16,A6
- JSR gClip3D
- MOVE.W (A7)+,D0
- EXT.L D0
- MOVE.L D0,-(A6)
- EXG D4,A7
- RTS
- END-CODE
-
- CODE SetPt3d ( pt3D x y z -- )
- EXG D4,A7
- MOVE.L 12(A6),-(A7)
- MOVE.L 8(A6),-(A7)
- MOVE.L 4(A6),-(A7)
- MOVE.L (A6),-(A7)
- ADDA.W #16,A6
- JSR gSetPt3D
- EXG D4,A7
- RTS
- END-CODE
-
- CODE SetPt2d ( pt2D x y -- )
- EXG D4,A7
- MOVE.L 8(A6),-(A7)
- MOVE.L 4(A6),-(A7)
- MOVE.L (A6),-(A7)
- ADDA.W #12,A6
- JSR gSetPt2D
- EXG D4,A7
- RTS
- END-CODE
-
- \ Translation of Boxes.pas example into Forth follows
- \ ___________________________________________________
-
- : .x ; mach
- : .y 4 + ; mach
- : .z 8 + ; mach
-
- : .pt1 ; mach
- : .pt2 12 + ; mach
-
- 15 CONSTANT BoxCount
- Variable MyPort 104 vallot \ grafPort is 108 bytes long
- Variable MyPort3D 150 vallot \ graf3DPort is 154 bytes long
- Variable boxArray 24 BoxCount * vallot
- \ BoxCount * 2* point3D @ 3 long words
- Variable nboxes \ # of boxes made
- Variable MyBox 20 vallot \ 24 bytes for 2* point3d
- Variable p1 8 vallot \ point3d
- Variable p2 8 vallot \ point3d
- Variable myRect 4 vallot \ Rect
- Variable testRect 4 vallot \ Rect
-
- : DrawBrick { pt1 pt2 | tempRgn -- }
- call NewRgn -> tempRgn
-
- call OpenRgn
- pt1 .x @ pt1 .y @ pt1 .z @ MoveTo3D
- pt1 .x @ pt1 .y @ pt2 .z @ LineTo3D
- pt2 .x @ pt1 .y @ pt2 .z @ LineTo3D
- pt2 .x @ pt1 .y @ pt1 .z @ LineTo3D
- pt1 .x @ pt1 .y @ pt1 .z @ LineTo3D
- tempRgn call CloseRgn
- tempRgn white call FillRgn
-
- call OpenRgn
- pt1 .x @ pt1 .y @ pt2 .z @ MoveTo3D
- pt1 .x @ pt2 .y @ pt2 .z @ LineTo3D
- pt2 .x @ pt2 .y @ pt2 .z @ LineTo3D
- pt2 .x @ pt1 .y @ pt2 .z @ LineTo3D
- pt1 .x @ pt1 .y @ pt2 .z @ LineTo3D
- tempRgn call CloseRgn
- tempRgn gray call FillRgn
-
- call OpenRgn
- pt2 .x @ pt1 .y @ pt1 .z @ MoveTo3D
- pt2 .x @ pt1 .y @ pt2 .z @ LineTo3D
- pt2 .x @ pt2 .y @ pt2 .z @ LineTo3D
- pt2 .x @ pt2 .y @ pt1 .z @ LineTo3D
- pt2 .x @ pt1 .y @ pt1 .z @ LineTo3D
- tempRgn call CloseRgn
- tempRgn black call FillRgn
-
- white call penpat
- pt2 .x @ pt2 .y @ pt2 .z @ MoveTo3D
- pt2 .x @ pt2 .y @ pt1 .z @ LineTo3D
- pt2 .x @ pt1 .y @ pt1 .z @ LineTo3D
- call pennormal
-
- tempRgn call DisposRgn
- ;
-
- : hi -16 scale ;
-
- : chkBox { | box -- }
- 1 ( flag )
- nBoxes @ 0 DO
- boxArray i 24 * + -> box
- testRect
- box .pt1 .x @ hi
- box .pt1 .y @ hi
- box .pt2 .x @ hi
- box .pt2 .y @ hi call SetRect
- testRect -1 -1 call InSetRect
- myRect testRect testRect call SectRect
- IF drop 0 leave THEN
- LOOP
- ;
-
- : MakeBox { | p1x p1y p1z p2x p2y p2z box ii -- }
- call random 70 mod 15 - 1 call FixRatio -> p1x
- call random 70 mod 10 - 1 call FixRatio -> p1y
- 0 -> p1z
-
- call random 30 mod abs 10 + 1 call FixRatio p1x + -> p2x
- call random 45 mod abs 10 + 1 call FixRatio p1y + -> p2y
- call random 30 mod abs 10 + 1 call FixRatio p1z + -> p2z
-
- myRect p1x hi p1y hi p2x hi p2y hi call SetRect
-
- chkBox IF
- p1x myBox .pt1 .x !
- p1y myBox .pt1 .y !
- p1z myBox .pt1 .z !
- p2x myBox .pt2 .x !
- p2y myBox .pt2 .y !
- p2z myBox .pt2 .z !
-
- 0 -> ii
- myBox boxArray nBoxes @ 24 * + 24 cmove
-
- BEGIN
- myBox .pt1 .y @ boxArray ii + .pt2 .y @ >
- myBox .pt2 .y @ boxArray ii + .pt1 .y @ > and
- myBox .pt1 .x @ boxArray ii + .pt2 .x @ <
- myBox .pt2 .x @ boxArray ii + .pt1 .x @ < and or
- WHILE
- 24 +> ii
- REPEAT
- ii 24 / -> ii
-
- ii 1+ nBoxes @ DO
- boxArray i 1- 24 * +
- boxArray i 24 * +
- 24 cmove
- -1 +loop
- myBox boxArray ii 24 * + 24 cmove
-
- 1 nBoxes +!
- THEN
- ;
-
- : drawGrid
- 11 -10 DO
- i 10 * 1 call FixRatio -100 1 call FixRatio 0
- MoveTo3D
- i 10 * 1 call FixRatio 100 1 call FixRatio 0
- LineTo3D
- LOOP
-
- 11 -10 DO
- -100 1 call FixRatio i 10 * 1 call FixRatio 0
- MoveTo3D
- 100 1 call FixRatio i 10 * 1 call FixRatio 0
- LineTo3D
- LOOP
- ;
-
- : restore.screen
- call drawmenubar
- call frontwindow
- grayrgn @ call paintbehind
- call showcursor
- ;
-
- : main
- init3d
- call hidecursor
- myPort call OpenPort
- myPort3D Open3DPort
- myPort portRect + ViewPort
- -100 1 call FixRatio 75 1 call FixRatio
- 100 1 call FixRatio -75 1 call FixRatio
- LookAt
- 30 1 call FixRatio ViewAngle
- Identity
- 20 1 call FixRatio Rol
- 70 1 call FixRatio Pitch
-
- BEGIN
- myPort3D SetPort3D
- 0 nBoxes !
- BEGIN makeBox nBoxes @ boxCount = UNTIL
-
- white call penPat
- black call backPat
- myPort portRect + call EraseRect
-
- drawGrid
-
- 0 nBoxes @ 1- DO
- boxArray i 24 * + dup .pt1 swap .pt2 DrawBrick
- -1 +LOOP
-
- ?terminal UNTIL
- restore.screen
- bye
- ;
-
-
- NEW.WINDOW Boxes
- " Boxes" Boxes TITLE
- 0 0 20 20 Boxes BOUNDS
- Plain Visible NoCloseBox NoGrowBox Boxes ITEMS
-
- 600 5000 terminal Box
-
- : go.box activate main ;
-
- : start
- Boxes add
- Boxes Box build
- Box go.Box
- ;
-
- .( To create a turkey application ) cr
- .( type TURNKEY START BOXES )
-